Apareo de archivos

  • Tomar dos archivos con datos relacionados
  • Utilizar la información vinculada de manera conjunta
    • Mostrar por pantalla
    • Generar un nuevo archivo
  • Los archivos deberían estar ordenados por los campos que los vinculan

Se cuenta con un archivo csv con usuarios de Twitter cuyo formato es id_usuario, alias, nombre y otro archivo csv con tweets de formato id_usuario, tweet,fecha. Se pide realizar una función que reciba los dos nombres de archivo y genere un nuevo archivo con el formato "<nombre>,<tweet>".


In [ ]:
import csv

def  vincular_nombres_y_tweets(archivo_usuarios, archivo_tweets, archivo_resultado=""):
    """
    Genera un nuevo archivo con los tweets viculados a sus respectivos emisores a partir de un archivo de usuarios y otro de tweets
    
    Args:
        - arch_usuarios (str): nombre del archivo csv con los usuarios de twitter
        - arch_tweets (str): nombre del archivo csv con los tweets por usuario
        
    """
    
    if not archivo_resultado:
        archivo_resultado = archivo_tweets +".res"
    
    with open(archivo_usuarios) as a_usuarios, \
              open(archivo_tweets) as a_tweets, \
              open(archivo_resultado) as a_resultado:
                reader_usuarios = csv.reader(a_usuarios, delimiter=";")
                reader_tweets = csv.reader(a_tweets, delimiter=";")
                writer_resultado = csv.writer(a_resultado, delimiter=";")
        
                # Si leemos el final del archivo, next da una excepcion. 
                # Como segundo parametro, definimos un valor en caso de que hayamos llegado al final (None)        
                if not next(reader_usuarios,None):
                    #Podria no tener datos, pero necesariamente deberia tener el encabezado
                    raise ValueError ("El archivo de usuarios esta completamente vacio")

                if not next(reader_tweets,None):
                    #Podria no tener datos, pero necesariamente deberia tener el encabezado
                    raise ValueError ("El archivo de tweets esta completamente vacio")

                tweet = next(reader_tweets, None) 
                for datos_usuario in reader_usuarios:
                    if len(datos_usuario) < 3:
                        continue #Omitimos las lineas mal formadas (nos faltaria algun dato)

                    while tweet != None: # tweet != None chequea si no hay mas tweets a leer
                            if len(tweet) < 2 :
                                tweet = next(reader_tweets, None) 
                                continue

                            if usuario[0] != tweet[0]:
                                break

                            writer_resultado.writerow( (usuario[2],tweet[1]) )
                
        
vincular_nombres_y_tweets("usuarios_twitter.csv", "tweets.csv")

Corte de control

  • Se requiere que el archivo esté ordenado por ciertos campos (por los que vamos a agrupar la información)
  • Agrupamos la información por dichos campos

Se cuenta con un archivo csv con actividad de twitter. El mismo tiene el formato alias;fecha;tweet;retweets;likes, y está ordenado por alias y luego por fecha. Queremos analizar la popularidad de los usuarios en base a su actividad y para eso necesitamos ver cuántas interacciones tuvieron sus tweets durante en función de los días. Se pide realizar una función que reciba el nombre del archivo como parámetro e imprima por pantalla la cantidad de likes y retweets separados por usuario y por fecha. Un ejemplo de salida de la función es el siguiente:

gvrossum:
- 04/05/2017: 4 tweets, 1535 retweets, 3518 likes
- 04/17/2017: 2 tweets, 758 retweets, 553 likes
- 04/21/2017: 5 tweets, 1153 retweets, 2650 likes
toddmotto:
- 04/04/2017: 2 tweets, 3157 retweets, 3666 likes
- 04/15/2017: 4 tweets, 428 retweets, 3179 likes
davidfowler:
- 03/05/2017: 3 tweets, 217 retweets, 655 likes
- 04/10/2017: 3 tweets, 87 retweets, 567 likes

In [ ]:
import csv

def mostrar_interacciones(arch_tweets):
    """
    Imprime por pantalla un resumen de interacciones de tweets agrupado por usuario y fecha 
    
    Args:
        - arch_tweets (str): nombre del archivo csv con los tweets por usuario y fecha
    """

    with open(arch_tweets) as a_tweets:
        reader = csv.DictReader(a_tweets, delimiter=";") # DictReader ya sabe que la primera linea es la cabecera
        prox_tweet = next(reader, None)
        tweets = 0
        retweets = 0
        likes = 0
        
        while prox_tweet:
            alias = prox_tweet['alias']
            fecha = prox_tweet['fecha']
            print("{}:".format(alias)) # imprimimos el alias del usuario para el que procesaremos la actividad
            
            while prox_tweet and prox_tweet['alias'] == alias:
                fecha = prox_tweet['fecha']
                
                while prox_tweet and prox_tweet['fecha'] == fecha:
                    tweets += 1
                    retweets += int(prox_tweet['retweets']) # convertimos a int porque el reader devuelve todo como string
                    likes += int(prox_tweet['likes'])
                    prox_tweet = next(reader, None)
                    
                print("- {}: {} tweets, {} retweets, {} likes".format(fecha, tweets, retweets, likes))
                tweets = 0
                retweets = 0
                likes = 0

mostrar_interacciones("actividad_twitter.csv")